#include "CuentaCorrienteModule.h"

extern QSqlDatabase enjoylifedb;
// Cuenta Corriente
extern CtaCteSqlTableModel *cuenta_corriente_model;
extern QTableView *cuenta_corriente_view;
// Cobro Mensual
//extern QSqlRelationalTableModel *cobro_mensual_model;
// Cliente
ClienteCteCtaSqlTableModel *client_cc_model;
QTableView *client_cc_view;

QLabel *label_client_sel;
QLineEdit *deuda_cliente_edit;
QLineEdit *deuda_pagina_edit;
QLineEdit *deuda_servicios_edit;
QLineEdit *find_line;

QString RazonSocial;

int selectionToRemove;

CuentaCorrienteModule::CuentaCorrienteModule(QWidget *parent) :
    QMainWindow(parent)
{
    cc_toolbar = new CustomModulesToolbar(this);
    addToolBar(cc_toolbar);
    AltaCCToolbar();
    RemoveCCToolbar();
    ModificacionCCToolbar();
    ActualizarListasToolbar();
//    ABMPersonaToolBar();
    ABMConceptoToolBar();
    ImprimirReciboToolbar();

    client_cc_model = new ClienteCteCtaSqlTableModel(this,enjoylifedb);
    client_cc_model->setTable("cliente");
    client_cc_model->setEditStrategy(ClienteCteCtaSqlTableModel::OnFieldChange);

    cuenta_corriente_model = new CtaCteSqlTableModel(this,enjoylifedb);
    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setEditStrategy(CtaCteSqlTableModel::OnFieldChange);

    cobro_mensual_model = new QSqlRelationalTableModel(this,enjoylifedb);
    cobro_mensual_model->setTable("cobro_mensual");

    QWidget* widget_main = new QWidget();
    QWidget* widgetModels = new QWidget;
    QWidget* widget_derecho = new QWidget();

    QVBoxLayout *layout = new QVBoxLayout;
    QSplitter *split = new QSplitter;

    QGridLayout *grid_lay_central = new QGridLayout();
    QGridLayout *grid_lay_derecho = new QGridLayout();

    QGroupBox *group_filtro= new QGroupBox("Filtros y Busqueda",this);
    QGroupBox *group_datosCC= new QGroupBox("Datos de cuenta corriente",this);

    QFormLayout *form_filtros = new QFormLayout;
    QFormLayout *form_datosCC = new QFormLayout;

    client_cc_view = new QTableView(split);
    client_cc_view->setModel(client_cc_model);

    client_cc_view->selectionModel()->selection().indexes();

    cuenta_corriente_view = new QTableView(split);
    cuenta_corriente_view->setModel(cuenta_corriente_model);
    cuenta_corriente_view->setAutoScroll(true);

    split->setOrientation(Qt::Horizontal);
    split->adjustSize();
    // Set the initial sizes for QSplitter widgets
    QList<int> sizes;
    sizes << 200 << 750;
    split->setSizes(sizes);
    layout->addWidget(split);
    widgetModels->setLayout(layout);

    UpdateClientList();
    ControlVencimientos();
    CleanCCList();

    // Filtros
    QLabel *filter_tipocobro_label = new QLabel("Tipo de Cobro",0);
    filter_tipocobro_label->setFixedWidth(180);
    filter_tipocobro_label->setFixedHeight(20);
    filter_tipocobro_label->setAlignment(Qt::AlignCenter);
    filter_tipocobro_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(filter_tipocobro_label);

    filter_servicio = new QRadioButton("Servicio",0);
    connect(filter_servicio,SIGNAL(clicked()),this,SLOT(FiltrarCobroServicio()));
    filter_servicio->setChecked(true);
    form_filtros->addRow(filter_servicio);

    filter_servicio_deuda = new QRadioButton("Servicio Deudas",0);
    connect(filter_servicio_deuda,SIGNAL(clicked()),this,SLOT(FiltrarDeudasServicio()));
    form_filtros->addRow(filter_servicio_deuda);

    filter_esporadico = new QRadioButton("Esporádico",0);
    connect(filter_esporadico,SIGNAL(clicked()),this,SLOT(FiltrarCobroEsporadico()));
    form_filtros->addRow(filter_esporadico);

    filter_esporadico_deuda = new QRadioButton("Esporádico Deudas",0);
    connect(filter_esporadico_deuda,SIGNAL(clicked()),this,SLOT(FiltrarDeudasEsporadico()));
    form_filtros->addRow(filter_esporadico_deuda);

    QLabel *filter_label = new QLabel("Busqueda Rápida",0);
    filter_label->setFixedWidth(180);
    filter_label->setFixedHeight(20);
    filter_label->setAlignment(Qt::AlignCenter);
    filter_label->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtros->addRow(filter_label);

    filter_cliente = new QRadioButton("Cliente",0);
    connect(filter_cliente,SIGNAL(clicked()),this,SLOT(EncontrarPersona()));
    form_filtros->addRow(filter_cliente);

    filter_anio = new QRadioButton("Año",0);
    connect(filter_anio,SIGNAL(clicked()),this,SLOT(EncontrarAnio()));
    form_filtros->addRow(filter_anio);

    find_line = new QLineEdit(this);
    find_line->setFixedSize(180,20);
    find_line->setEnabled(false);
    form_filtros->addRow(find_line);

    // Datos informativos
    label_client_sel = new QLabel("Deuda de ",0);
    label_client_sel->setFixedSize(180,20);
    label_client_sel->setAlignment(Qt::AlignCenter);
    label_client_sel->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_datosCC->addRow(label_client_sel);

    deuda_cliente_edit = new QLineEdit(this);
    deuda_cliente_edit->setFixedSize(180,60);
    deuda_cliente_edit->setEnabled(false);
    deuda_cliente_edit->setAlignment(Qt::AlignCenter);
    deuda_cliente_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_datosCC->addRow(deuda_cliente_edit);

    QLabel *saldo_label2 = new QLabel("Monto cobro Esporádico $",0);
    saldo_label2->setFixedSize(180,20);
    saldo_label2->setAlignment(Qt::AlignCenter);
    saldo_label2->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_datosCC->addRow(saldo_label2);

    deuda_pagina_edit = new QLineEdit(this);
    deuda_pagina_edit->setFixedSize(180,60);
    deuda_pagina_edit->setEnabled(false);
    deuda_pagina_edit->setAlignment(Qt::AlignCenter);
    deuda_pagina_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_datosCC->addRow(deuda_pagina_edit);

    QLabel *saldo_label3 = new QLabel("Monto cobro servicios $",0);
    saldo_label3->setFixedSize(180,20);
    saldo_label3->setAlignment(Qt::AlignCenter);
    saldo_label3->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_datosCC->addRow(saldo_label3);

    deuda_servicios_edit = new QLineEdit(this);
    deuda_servicios_edit->setFixedSize(180,60);
    deuda_servicios_edit->setEnabled(false);
    deuda_servicios_edit->setAlignment(Qt::AlignCenter);
    deuda_servicios_edit->setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 34pt \"Helvetica57-Condensed\";border-style: solid");
    form_datosCC->addRow(deuda_servicios_edit);

    // ==========================================
    group_filtro->setLayout(form_filtros);
    group_filtro->setFixedWidth(200);

    group_datosCC->setLayout(form_datosCC);
    group_datosCC->setFixedWidth(200);

    grid_lay_derecho->addWidget(group_filtro,0,0);
    grid_lay_derecho->addWidget(group_datosCC,1,0);

    widget_derecho->setLayout(grid_lay_derecho);
    widget_derecho->setFixedWidth(210);

    grid_lay_central->addWidget(widgetModels,0,0);
    grid_lay_central->addWidget(widget_derecho,0,1);

    widget_main->setLayout(grid_lay_central);
    setCentralWidget(widget_main);
    // ==========================================

    connect(client_cc_view, SIGNAL(clicked(QModelIndex)), this, SLOT(SeleccionarCC()));
    //    connect(cuenta_corriente_view, SIGNAL(clicked(QModelIndex)), this, SLOT(ActualizarDeuda()));
    connect(cuenta_corriente_view, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(EditCCBtn()));
    connect(client_cc_view, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(AbrirInfoCliente()));

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    QShortcut* shortcutAlta = new QShortcut(QKeySequence("Ctrl+A"), cuenta_corriente_view);
    connect(shortcutAlta, SIGNAL(activated()), this, SLOT(AltaCCBtn()));
    // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
    QShortcut* shortcutBaja = new QShortcut(QKeySequence(QKeySequence::Delete), cuenta_corriente_view);
    connect(shortcutBaja, SIGNAL(activated()), this, SLOT(RemoveCCBtn()));
    // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
    QShortcut* shortcutModif = new QShortcut(QKeySequence("Ctrl+M"), cuenta_corriente_view);
    connect(shortcutModif, SIGNAL(activated()), this, SLOT(EditCCBtn()));
    // Definición de acceso directo para actualizr la lista mediante la combinacion de teclas "Ctrl + U".
    QShortcut* shortcutActualizar = new QShortcut(QKeySequence("Ctrl+U"), this);
    connect(shortcutActualizar, SIGNAL(activated()), this, SLOT(UpdateListsBtn()));
    // Definición de acceso directo para abrir abm de conceptos mediante la combinacion de teclas "Ctrl + C".
    QShortcut* shortcutABMConcepto = new QShortcut(QKeySequence("Ctrl+C"), this);
    connect(shortcutABMConcepto, SIGNAL(activated()), this, SLOT(ABMConceptoBtn()));
    // Definición de acceso directo para imprimir recibo mediante la combinacion de teclas "Ctrl + R".
    QShortcut* shortcutRecibo = new QShortcut(QKeySequence("Ctrl+R"), client_cc_view);
    connect(shortcutRecibo, SIGNAL(activated()), this, SLOT(ImprimirReciboBtn()));
}

void CuentaCorrienteModule::AltaCCBtn()
{
    QSqlQuery *query = new QSqlQuery(enjoylifedb);

    if (! query->exec("select razon_social from cliente")) {
        QMessageBox::critical(this,"Error","No se pueden recuperar los cliente, intente nuevamente");
        return;
    }

    if (query->size() == 0) {
        QMessageBox::information(this,"Advertencia!", "No se encuentran registrados clientes. Imposible cargar registros en cuenta corriente");
        return;
    }
    else {
        AltaCuentaCorriente *alta_cc = new AltaCuentaCorriente();
        alta_cc->show();
    }

    UpdateCCList();
    ActualizarDeuda(RazonSocial);
}

void CuentaCorrienteModule::RemoveCCBtn()
{
    QModelIndexList selection;
    if (!(cuenta_corriente_view->currentIndex().row() == -1))
        selection.append(cuenta_corriente_view->currentIndex());

    if (!selection.empty()) {
        QModelIndex idIndex = selection.first();
        QString idCtaCte = idIndex.sibling(idIndex.row(), 0).data().toString();
        QString rs = idIndex.sibling(idIndex.row(), 1).data().toString();
        QString tipoCobro = idIndex.sibling(idIndex.row(), 2).data().toString();
        QString estadoDeuda = idIndex.sibling(idIndex.row(), 6).data().toString();
        QString moneda = idIndex.sibling(idIndex.row(), 7).data().toString();
        QString idMoneda = idIndex.sibling(idIndex.row(), 8).data().toString();

        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Eleminar Cuenta Corriente"),
                                       tr("¿Está seguro que quiere "
                                          "eliminar la cuenta corriente '%1'?").arg(rs),
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            if (moneda == "Cheque") {
                QMessageBox::critical(this,"AVISO!", tr("La Cta. Cte. que va a eliminar está asociada a un Cheque. "),
                                      tr("Al finalizar esta acción dirijase al Módulo Cheques para corroboar los datos del Cheque Nro.: '%1'.").arg(idMoneda));
            }
            // Se elimina la cta cte seleccionada
            enjoylifedb.transaction();
            if (!cuenta_corriente_model->removeRow(idIndex.row())) {
                QMessageBox::critical(this,"Error!", "No se pudo eliminar la cuenta corriente, vuelva a intentarlo. ");
                enjoylifedb.rollback();
                return;
            }

            // Se elimina el cobro mensual asociado
            //            enjoylifedb.transaction();

            //            if (!cobro_mensual_model->removeRow(idIndex.row())) {
            //                QMessageBox::critical(this,"Error!", "No se pudo eliminar la cuenta corriente del modulo cobro mensual, vuelva a intentarlo.");
            //                enjoylifedb.rollback();
            //                return;
            //            }

            if (estadoDeuda == "Pagó") {
                enjoylifedb.transaction();
                QSqlQuery *query = new QSqlQuery(enjoylifedb);
                QString stm = "delete from movimiento where idCtaCte = '" + idCtaCte + "'";
                if (! query->exec(stm)) {
                    QMessageBox::critical(this,"Error!", "No se pudo remover el cheque de los movimientos, "
                                          "intentelo nuevamente || " + query->lastError().text());
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
                enjoylifedb.commit();
                enjoylifedb.commit();
            }
            enjoylifedb.commit();
            enjoylifedb.commit();
            QMessageBox::information(this,"Exito!", "La cuenta corriente se eliminó correctamente. "
                                     "Y se eliminó de la table movimientos. Por favor corroborar los datos",
                                     QMessageBox::Ok);
        }

//        if (tipoCobro == "Servicio")
//            FiltrarCobroServicio();
//        else
//            FiltrarCobroEsporadico();

    } else {
        QMessageBox::warning(this, tr("Eleminar Pago de Cta. Cte."),
                             tr("La operación no se puede concretar."
                                "\nNingún pago ha sido seleccionado."));
    }
    UpdateCCList();
//    ActualizarDeuda(cliente);
}

void CuentaCorrienteModule::EditCCBtn()
{
    // Se controla para el caso que no existan pagos cargados.
    if (cuenta_corriente_model->rowCount() == 0) {
        QMessageBox::information(this,"Información!","No hay registros disponibles.");
        return;
    }

    int selection = -1;
    if (!(cuenta_corriente_view->currentIndex().row() == -1)) {
        selection = cuenta_corriente_view->currentIndex().row();
    }

    if (!(selection == -1)) {
        enjoylifedb.transaction();
        tipoCobro = cuenta_corriente_model->index(selection,2).data().toString();

//        UpdateCCList();
//        if (tipoCobro == "Servicio")
//            FiltrarCobroServicio();
//        if (tipoCobro == "Esporádico")
//            FiltrarCobroEsporadico();

        ModificacionCuentaCorriente *edit_cc = new ModificacionCuentaCorriente();
        edit_cc->GetCCInfo(selection);
        edit_cc->show();

        enjoylifedb.commit();
    }
    else {
        QMessageBox::warning(this, tr("Modificar Cta. Cte."),
                             tr("La operación no se puede concretar."
                                "\nNingún Movimiento ha sido seleccionado."));
    }
    UpdateCCList();
}

void CuentaCorrienteModule::UpdateListsBtn()
{
    filter_servicio->setChecked(true);
    ControlVencimientos();
    UpdateClientList();
    CleanCCList();
    deuda_cliente_edit->clear();
    deuda_pagina_edit->clear();
    deuda_servicios_edit->clear();
}

///*
// * Acción del boton: Ejecuta la ventana para administrar las personas.
// */
//void CuentaCorrienteModule::ABMPersonaBtn()
//{
//    ABMPersona *abm_persona = new ABMPersona();
//    abm_persona->show();
//    UpdateListsBtn();
//}

/*
 * Acción del boton: Ejecuta la ventana para administrar los conceptos.
 */
void CuentaCorrienteModule::ABMConceptoBtn()
{
    ABMConcepto *abm_concepto = new ABMConcepto();
    abm_concepto->show();
    UpdateListsBtn();
}

void CuentaCorrienteModule::ImprimirReciboBtn()
{
//    int selection = -1;
//    if (client_cc_view->currentIndex().row() != 1)
//        selection = client_cc_view->currentIndex().row();

//     qDebug() << "Recibo: " << client_cc_model->index(selection,1).data().toString();

//    if (selection != -1) {

        GenerarRecibo *rec = new GenerarRecibo();
//                    0,client_cc_model->index(selection,1).data().toString());
        rec->show();
//    } else {
//        QMessageBox::warning(this, tr("Generar Recibo de Pago."),
//                             tr("La operación no se puede concretar."
//                                "\nNingún cliente ha sido seleccionado."));
//    }
}

void CuentaCorrienteModule::BuscarRazonSocial()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        QString filterClient;
        filterClient = "cc_razon_social ilike '%" + find_line->text() + "%'";
        filterClient.append(" and estado is null");

        cuenta_corriente_model->setTable("cuenta_corriente");
        cuenta_corriente_model->filter().clear();
        cuenta_corriente_model->setFilter(filterClient);

        if (!(cuenta_corriente_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateCCView();
            return;
        }
        else {
            enjoylifedb.commit();
            RefreshCCView();
        }
    }
    else
        UpdateCCView();
}

/**
 * @brief AbrirInfoCliente
 */
void CuentaCorrienteModule::AbrirInfoCliente()
{
    int selection = -1;
    if (!(client_cc_view->currentIndex().row() == -1)) {
        selection = client_cc_view->currentIndex().row();
    }

    if (!(selection == -1)) {
        enjoylifedb.transaction();

        EditClient *edit_client_form = new EditClient();
        edit_client_form->GetClientInfo(selection);
        edit_client_form->show();

        enjoylifedb.commit();
    } else {
        QMessageBox::warning(this, tr("Modificar Cliente"),
                             tr("La operación no se puede concretar."
                                "\nNingún cliente ha sido seleccionado."));
    }
}

void CuentaCorrienteModule::SeleccionarCC()
{
    int selection = -1;
    selectionToRemove = -1;
    if (!(client_cc_view->currentIndex().row() == -1)) {
        selection = client_cc_view->currentIndex().row();
        selectionToRemove = selection;
    }

    if (!(selection == -1)) {
        QDate date;
        date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
        QString formatYear = "yyyy";
        QString anio = date.toString(formatYear);
        cliente = client_cc_model->index(selection,1).data().toString();
        enjoylifedb.transaction();
        QString filtro = "cc_razon_social = '";
        filtro.append(cliente).append("'");
//        filtro.append("' and tipo_cobro = 'Servicio'");
//        filtro.append("' and date_part('year', desde) = '").append(anio).append("'");
        cuenta_corriente_model->setTable("cuenta_corriente");
        cuenta_corriente_model->setFilter(filtro);

        if (! cuenta_corriente_model->select()) {
            QMessageBox::critical(this,"Error!", "No hay registros cargados para este cliente.");
            enjoylifedb.rollback();
            RefreshCCView();
            return;
        }

        enjoylifedb.commit();
        ActualizarDeuda(cliente);
        RefreshCCView();
    }

    servicioChecked = false;
    servicioDeudaChecked = false;
    esporadicoChecked = false;
    esporadicoDeudaChecked = false;
}

void CuentaCorrienteModule::FiltrarCobroServicio()
{
    int selection = -1;
    if (client_cc_view->currentIndex().row() != -1)
        selection = client_cc_view->currentIndex().row();

    find_line->clear();

    QDate date;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString formatYear = "yyyy";
    QString anio = date.toString(formatYear);
    QString filtro = "cc_razon_social = '";
    filtro.append(cliente);
    filtro.append("' and tipo_cobro = 'Servicio'");
    filtro.append(" and date_part('year', desde) = '").append(anio).append("'");

    if (selection != -1) {
        enjoylifedb.transaction();
        cuenta_corriente_model->setTable("cuenta_corriente");
        cuenta_corriente_model->setFilter(filtro);
        if (!cuenta_corriente_model->select()) {
            QMessageBox::critical(this,"Error!", "No hay registros cargados para el tipo de cobro: Servicio.");
            enjoylifedb.rollback();
            RefreshCCView();
            return;
        }
        enjoylifedb.commit();
        RefreshCCView();
    }

    servicioChecked = true;
    servicioDeudaChecked = false;
    esporadicoChecked = false;
    esporadicoDeudaChecked = false;
}

void CuentaCorrienteModule::FiltrarDeudasServicio()
{
    int selection = -1;
    if (client_cc_view->currentIndex().row() != -1)
        selection = client_cc_view->currentIndex().row();

    find_line->clear();

    QString filtro = "cc_razon_social = '";
    filtro.append(cliente).append("'");
    filtro.append(" and tipo_cobro = 'Servicio'");
    filtro.append(" and estado_deuda = 'Debe'");

    if (selection != -1) {
        enjoylifedb.transaction();
        cuenta_corriente_model->setTable("cuenta_corriente");
        cuenta_corriente_model->setFilter(filtro);
        if (!cuenta_corriente_model->select()) {
            QMessageBox::critical(this,"Error!", "No hay registros cargados para el tipo de cobro: Servicio.");
            enjoylifedb.rollback();
            RefreshCCView();
            return;
        }
        enjoylifedb.commit();
        RefreshCCView();
    }

    servicioChecked = false;
    servicioDeudaChecked = true;
    esporadicoChecked = false;
    esporadicoDeudaChecked = false;
}

void CuentaCorrienteModule::FiltrarCobroEsporadico()
{
    int selection = -1;
    if (client_cc_view->currentIndex().row() != -1)
        selection = client_cc_view->currentIndex().row();

    QDate date;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString formatYear = "yyyy";
    QString anio = date.toString(formatYear);
    QString filtro = "cc_razon_social = '";
    filtro.append(cliente);
    filtro.append("' and tipo_cobro = 'Esporádico'");
    filtro.append(" and date_part('year', desde) = '").append(anio).append("'");

    if (selection != -1) {
        enjoylifedb.transaction();
        cuenta_corriente_model->setTable("cuenta_corriente");
        cuenta_corriente_model->setFilter(filtro);
        if (!cuenta_corriente_model->select()) {
            QMessageBox::critical(this,"Error!", "No hay registros cargados para el tipo de cobro: Esporádico.");
            enjoylifedb.rollback();
            RefreshCCView();
            return;
        }
        enjoylifedb.commit();
        RefreshCCView();
    }

    servicioChecked = false;
    servicioDeudaChecked = false;
    esporadicoChecked = true;
    esporadicoDeudaChecked = false;
}

void CuentaCorrienteModule::FiltrarDeudasEsporadico()
{
    int selection = -1;
    if (client_cc_view->currentIndex().row() != -1)
        selection = client_cc_view->currentIndex().row();

    find_line->clear();

    QString filtro = "cc_razon_social = '";
    filtro.append(cliente).append("'");
    filtro.append(" and tipo_cobro = 'Esporádico'");
    filtro.append(" and estado_deuda = 'Debe'");

    if (selection != -1) {
        enjoylifedb.transaction();
        cuenta_corriente_model->setTable("cuenta_corriente");
        cuenta_corriente_model->setFilter(filtro);
        if (!cuenta_corriente_model->select()) {
            QMessageBox::critical(this,"Error!", "No se pudo recuperar los registros para el tipo de cobro: Esporádico.");
            enjoylifedb.rollback();
            RefreshCCView();
            return;
        }
        enjoylifedb.commit();
        RefreshCCView();
    }

    servicioChecked = false;
    servicioDeudaChecked = false;
    esporadicoChecked = false;
    esporadicoDeudaChecked = true;
}

/**
 * @brief CuentaCorrienteModule::EncontrarPersona
 */
void CuentaCorrienteModule::EncontrarPersona()
{
    if (filter_cliente->isChecked()) {
        CleanCCList();
        filter_anio->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroAnio()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
    }
    else {
        UpdateClientList();
        CleanCCList();
        find_line->setEnabled(false);
    }
}

/**
 * @brief CuentaCorrienteModule::FiltroPersona
 */
void CuentaCorrienteModule::FiltroPersona()
{
    CleanCCList();
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filtroCC = "razon_social ilike '%" + find_line->text() + "%'";
        filtroCC.append(" and estado is null");
        client_cc_model->setTable("cliente");
        client_cc_model->filter().clear();
        client_cc_model->setFilter(filtroCC);
        if (!(client_cc_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientList();
            CleanCCList();
            return;
        }
        else {
            enjoylifedb.commit();
            RefreshClientCCView();
            CleanCCList();
        }
    }
    else {
        UpdateClientList();
        CleanCCList();
    }
}

/**
 * @brief CuentaCorrienteModule::EncontrarAnio
 */
void CuentaCorrienteModule::EncontrarAnio()
{
    if (filter_anio->isChecked()) {
        filter_cliente->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FiltroAnio()));
    }
    else {
        UpdateClientList();
        CleanCCList();
        find_line->setEnabled(false);
    }
}

/**
 * @brief CuentaCorrienteModule::FiltroAnio
 */

void CuentaCorrienteModule::FiltroAnio()
{
//    QString filtroTipoCobro;
//    if (servicioChecked)
//        filtroTipoCobro = "tipo_cobro = 'Servicio'";
//    else {
//        if (servicioDeudaChecked)
//            filtroTipoCobro = "tipo_cobro = 'Servicio' and estado_deuda = 'Debe'";
//        else {
//            if (esporadicoChecked)
//                filtroTipoCobro = "tipo_cobro = 'Esporádico'";
//            else {
//                if (esporadicoDeudaChecked)
//                    filtroTipoCobro = "tipo_cobro = 'Esporádico' and estado_deuda = 'Debe'";
//            }
//        }
//    }

    int selection = -1;
    if (!(client_cc_view->currentIndex().row() == -1)) {
        selection = client_cc_view->currentIndex().row();
    }

    if (!find_line->text().isEmpty()) {
        if (!(selection == -1)) {
            enjoylifedb.transaction();
            cliente = client_cc_model->index(selection,1).data().toString();
            anio = "date_part('year', desde) = '" + find_line->text() + "'";
            filtroCC = "cc_razon_social = '" + cliente + "'" ;
            filtroCC = filtroCC + " and " + anio; // + " and " + filtroTipoCobro;
            cuenta_corriente_model->setTable("cuenta_corriente");
            cuenta_corriente_model->filter().clear();
            cuenta_corriente_model->setFilter(filtroCC);
            if (!(cuenta_corriente_model->select())) {
                QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
                enjoylifedb.rollback();
                RefreshCCView();
                return;
            }
            else {
                enjoylifedb.commit();
                RefreshCCView();
            }
        }
        else {
            QMessageBox::critical(this,"Error!", "No se seleccionó ningún cliente.");
            return;
        }
    }
    else {
        UpdateClientList();
        FiltrarCobroServicio();
    }
}

void CuentaCorrienteModule::ActualizarDeuda(QString client_selected)
{
    //    QString client_selected = cuenta_corriente_model->index(cuenta_corriente_view->currentIndex().row(),1).data().toString();
    label_client_sel->clear();
    QString lab_sel;
    lab_sel.append("Deuda de ").append(client_selected);
    label_client_sel->setText(lab_sel);

    // =================================================================
    QSqlQuery *query_total = new QSqlQuery(enjoylifedb);

    QString str_query;
    str_query.append("select sum(debe) from cuenta_corriente where cc_razon_social = '");
    str_query.append(client_selected);
    str_query.append("'");
    str_query.append(" and estado_deuda = 'Debe'");

    if (! query_total->exec(str_query)) {
        QMessageBox::critical(this,"Advertencia","No se puede realizar la consulta, intente nuevamente");
        return;
    }

    double suma_total = -1;
    while (query_total->next())
        suma_total = query_total->value(0).toDouble();

    const int precision = 2;
    deuda_cliente_edit->clear();
    deuda_cliente_edit->setText(QString("%1").arg(suma_total, 0, 'f', precision));

    // =================================================================
    QSqlQuery *query_pagina = new QSqlQuery(enjoylifedb);
    QString str_query2;
    str_query2.append("select sum(debe) from cuenta_corriente where cc_razon_social = '");
    str_query2.append(client_selected);
    str_query2.append("'").append(" and tipo_cobro = 'Esporádico'");

    if (! query_pagina->exec(str_query2)) {
        QMessageBox::critical(this,"Advertencia","No se puede realizar la consulta, intente nuevamente");
        return;
    }

    double suma_pag = -1;
    while (query_pagina->next())
        suma_pag = query_pagina->value(0).toDouble();

    deuda_pagina_edit->clear();
    deuda_pagina_edit->setText(QString("%1").arg(suma_pag, 0, 'f', precision));

    // =================================================================
    QDate date;
    QString formatAnio = "yyyy";
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString anio = date.toString(formatAnio);
    QSqlQuery *query_servicio = new QSqlQuery(enjoylifedb);
    QString str_query3;
    str_query3.append("select sum(debe) from cuenta_corriente where cc_razon_social = '");
    str_query3.append(client_selected);
    str_query3.append("' and tipo_cobro = 'Servicio'");
    str_query3.append(" and date_part('year', desde) = '");
    str_query3.append(anio).append("'");

    if (! query_servicio->exec(str_query3)) {
        QMessageBox::critical(this,"Advertencia","No se puede realizar la consulta, intente nuevamente");
        return;
    }

    double suma_serv = -1;
    while (query_servicio->next())
        suma_serv = query_servicio->value(0).toDouble();

    deuda_servicios_edit->clear();
    deuda_servicios_edit->setText(QString("%1").arg(suma_serv, 0, 'f', precision));
}

/**
 * @brief ControlVencimientos
 * Controla las fechas y actualiza los estados de las cuentas.
 */
void CuentaCorrienteModule::ControlVencimientos()
{
    int cantRows = 0;
    QDate date2;
    QString formatoMes = "MM";
    QString mes = date2.currentDate().toString(formatoMes);
    QString formatoAnio = "yyyy";
    QString anio = date2.currentDate().toString(formatoAnio);
    QString filtro;
    filtro = "date_part('month', desde) <= '";
    filtro.append(mes).append("'");
    filtro.append(" and date_part('year', desde) <= '");
    filtro.append(anio).append("'");
    filtro.append(" and estado_deuda = 'No informado'");

    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Advertencia","No se pudo actualizar los estados de las Ctas. Ctes.");
        enjoylifedb.rollback();
        CleanCCList();
        return;
    }
    cobro_mensual_model->setTable("cobro_mensual");
    cobro_mensual_model->setFilter(filtro);
    enjoylifedb.transaction();
    if (!cobro_mensual_model->select()) {
        QMessageBox::critical(this,"Advertencia","No se pudo actualizar los estados de los Cobros mensuales.");
        enjoylifedb.rollback();
        CleanCCList();
        return;
    }
    cantRows = cuenta_corriente_model->rowCount();
    if (cantRows > 0) {
        for (int i = 0; i < cantRows; ++i) {
            QSqlRecord record = cuenta_corriente_model->record(i);
            QSqlRecord recordCM = cobro_mensual_model->record(i);
            record.setValue("estado_deuda","Debe");
            recordCM.setValue("estado_deuda","Debe");
            cuenta_corriente_model->setRecord(i, record);
            cobro_mensual_model->setRecord(i, recordCM);
            enjoylifedb.transaction();
            if (!cuenta_corriente_model->submitAll()) {
                QString error = cuenta_corriente_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de una Cta. Cte. Por favor controle las Ctas. Ctes."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            if (!cobro_mensual_model->submitAll()) {
                QString error = cobro_mensual_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo actualizar el estado de un Cobro Mensual. Por favor controle los Cobros mensuales."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            enjoylifedb.commit();
            enjoylifedb.commit();
            enjoylifedb.commit();
        }
    }
    CleanCCList();
}

void CuentaCorrienteModule:: UpdateCCView()
{
    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->filter().clear();
    enjoylifedb.transaction();
    if (! cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Error!","No se pueden recuperar los registros");
        return;
    }
    enjoylifedb.commit();

    RefreshCCView();
}

void CuentaCorrienteModule::RefreshCCView()
{
    cuenta_corriente_model->setHeaderData(0,Qt::Horizontal,"Nro. Cta.");
    cuenta_corriente_model->setHeaderData(2,Qt::Horizontal,"Tipo de Cobro");
    cuenta_corriente_model->setHeaderData(3,Qt::Horizontal,"Concepto");
    cuenta_corriente_model->setHeaderData(12,Qt::Horizontal,"Descripción");
    cuenta_corriente_model->setHeaderData(4,Qt::Horizontal,"Monto");
    cuenta_corriente_model->setHeaderData(5,Qt::Horizontal,"Desde fecha");
    cuenta_corriente_model->setHeaderData(7,Qt::Horizontal,"Tipo Moneda");
    cuenta_corriente_model->setHeaderData(8,Qt::Horizontal,"Id Moneda");
    cuenta_corriente_model->setHeaderData(9,Qt::Horizontal,"Fecha Pagó");
    cuenta_corriente_model->setHeaderData(11,Qt::Horizontal,"Monto Pagado");

    cuenta_corriente_view->setModel(cuenta_corriente_model);
    cuenta_corriente_view->setCornerButtonEnabled(true);
    cuenta_corriente_view->setAlternatingRowColors(true);
    cuenta_corriente_view->setGridStyle(Qt::SolidLine);
    cuenta_corriente_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cuenta_corriente_view->setWordWrap(true);
    cuenta_corriente_view->setSortingEnabled(false);
    cuenta_corriente_view->sortByColumn(5, Qt::AscendingOrder);
//    cuenta_corriente_view->horizontalHeader()->setStretchLastSection(true);
    cuenta_corriente_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    cuenta_corriente_view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    cuenta_corriente_view->hideColumn(1);
    cuenta_corriente_view->hideColumn(6);
    cuenta_corriente_view->hideColumn(10);
//    cuenta_corriente_view->hideColumn(11);
}

void CuentaCorrienteModule::UpdateClientList()
{
    enjoylifedb.transaction();
    QString filtro = "estado is null";
    client_cc_model->setTable("cliente");
    client_cc_model->setFilter(filtro);
    if (!(client_cc_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();

    RefreshClientCCView();
}

void CuentaCorrienteModule::UpdateCCList()
{
    QDate date;
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString formatYear = "yyyy";
    QString anio = date.toString(formatYear);
//    cliente = client_cc_model->index(seleccion,1).data().toString();
    enjoylifedb.transaction();
    QString filtro = "cc_razon_social = '";
    cliente = client_cc_model->index(selectionToRemove,1).data().toString();
    filtro.append(cliente);

    //        filtro.append("' and tipo_cobro = 'Servicio'");
    filtro.append("' and date_part('year', desde) = '").append(anio).append("'");
    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setFilter(filtro);

    qDebug() << "query: " << filtro;

    if (! cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Error!", "No hay registros cargados para este cliente.");
        enjoylifedb.rollback();
        RefreshCCView();
        return;
    }

    enjoylifedb.commit();
    ActualizarDeuda(cliente);
    RefreshCCView();

    servicioChecked = false;
    servicioDeudaChecked = false;
    esporadicoChecked = false;
    esporadicoDeudaChecked = false;
}

void CuentaCorrienteModule::RefreshClientCCView()
{
    client_cc_model->setHeaderData(1,Qt::Horizontal,"Cliente");

    client_cc_view->setModel(client_cc_model);
    client_cc_view->hideColumn(0);
    client_cc_view->hideColumn(2);
    client_cc_view->hideColumn(3);
    client_cc_view->hideColumn(4);
    client_cc_view->hideColumn(5);
    client_cc_view->hideColumn(6);
    client_cc_view->hideColumn(7);
    client_cc_view->hideColumn(8);
    client_cc_view->hideColumn(9);
    client_cc_view->hideColumn(10);
    client_cc_view->hideColumn(11);
    client_cc_view->hideColumn(12);
    client_cc_view->hideColumn(13);
    client_cc_view->hideColumn(14);
    client_cc_view->hideColumn(15);
    client_cc_view->hideColumn(16);
    client_cc_view->hideColumn(17);
    client_cc_view->hideColumn(18);
    client_cc_view->hideColumn(19);
    client_cc_view->hideColumn(20);
    client_cc_view->hideColumn(21);

    client_cc_view->setCornerButtonEnabled(true);
    client_cc_view->setAlternatingRowColors(true);
    client_cc_view->setGridStyle(Qt::SolidLine);
    client_cc_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    client_cc_view->setWordWrap(true);
    client_cc_view->horizontalHeader()->setStretchLastSection(true);
    client_cc_view->sortByColumn(1,Qt::SortOrder());
}

void CuentaCorrienteModule::CleanCCList()
{
    QString Filtro = "cc_razon_social = '  '";
    enjoylifedb.transaction();
    cuenta_corriente_model->setTable("cuenta_corriente");
    cuenta_corriente_model->setFilter(Filtro);
    if (!cuenta_corriente_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        RefreshCCView();
        return;
    }
    enjoylifedb.commit();
    RefreshCCView();
}

void CuentaCorrienteModule::AltaCCToolbar()
{
    action_alta_cc = new QAction("Alta Cuenta Corriente",this);
    action_alta_cc->setIcon(QIcon("://Icons/BarraHerramientas/alta48.png"));
    action_alta_cc->setToolTip("Agrega un nuevo registro a cuenta corriente");
    connect(action_alta_cc,SIGNAL(triggered()),this,SLOT(AltaCCBtn()));

    cc_toolbar->addAction(action_alta_cc);
}

void CuentaCorrienteModule::RemoveCCToolbar()
{
    action_remove_cc = new QAction("Borrar Cuenta Corriente",this);
    action_remove_cc->setIcon(QIcon("://Icons/BarraHerramientas/baja48.png"));
    action_remove_cc->setToolTip("Borra una cuenta corriente");
    connect(action_remove_cc,SIGNAL(triggered()),this,SLOT(RemoveCCBtn()));

    cc_toolbar->addAction(action_remove_cc);

}

void CuentaCorrienteModule::ModificacionCCToolbar()
{
    action_edit_cc = new QAction("Modificar Cuenta Corriente",this);
    action_edit_cc->setIcon(QIcon("://Icons/BarraHerramientas/modificar48.png"));
    action_edit_cc->setToolTip("Modifica un nuevo registro de cuenta corriente");
    connect(action_edit_cc,SIGNAL(triggered()),this,SLOT(EditCCBtn()));

    cc_toolbar->addAction(action_edit_cc);
}

void CuentaCorrienteModule::ActualizarListasToolbar()
{
    action_update_cc = new QAction("Actualizar Listados",this);
    action_update_cc->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    action_update_cc->setToolTip("Actualiza las listas de clientes y de ctas ctes");
    connect(action_update_cc,SIGNAL(triggered()),this,SLOT(UpdateListsBtn()));

    cc_toolbar->addSeparator();
    cc_toolbar->addAction(action_update_cc);
    cc_toolbar->addSeparator();
}

///*
// * Icono: ABM Persona.
// */
//void CuentaCorrienteModule::ABMPersonaToolBar()
//{
//    action_abmPersona = new QAction("ABM Persona",this);
//    action_abmPersona->setIcon(QIcon("://Icons/BarraHerramientas/abmPersonas48.png"));
//    action_abmPersona->setToolTip("Administra Personas");

//    connect(action_abmPersona,SIGNAL(triggered()),this,SLOT(ABMPersonaBtn()));

//    cc_toolbar->addAction(action_abmPersona);
//}

/*
 * Icono: ABM Concepto.
 */
void CuentaCorrienteModule::ABMConceptoToolBar()
{
    action_abmConcepto = new QAction("ABM Concepto", this);
    action_abmConcepto->setIcon(QIcon("://Icons/BarraHerramientas/abmConceptos48.png"));
    action_abmConcepto->setToolTip("Administra Conceptos");
    connect(action_abmConcepto,SIGNAL(triggered()),this,SLOT(ABMConceptoBtn()));

    cc_toolbar->addAction(action_abmConcepto);
}

void CuentaCorrienteModule::ImprimirReciboToolbar()
{
    action_recibo_cc = new QAction("Imprimir Recibo",this);
    action_recibo_cc->setIcon(QIcon("://Icons/BarraHerramientas/recibo48.png"));
    action_recibo_cc->setToolTip("Permite imprimir el recibo");
    connect(action_recibo_cc,SIGNAL(triggered()),this,SLOT(ImprimirReciboBtn()));

    cc_toolbar->addAction(action_recibo_cc);
}

//void CuentaCorrienteModule::GenerarReciboClientePDF(QString path, QString raz_soc)
//{
//    QString report_name = "Recibo_";
//    report_name.append(raz_soc);
//    report_name.append("_");
//    switch (QDate::currentDate().month()) {
//    case 1:
//        report_name.append("Enero");
//        break;
//    case 2:
//        report_name.append("Febrero");
//        break;
//    case 3:
//        report_name.append("Marzo");
//        break;
//    case 4:
//        report_name.append("Abril");
//        break;
//    case 5:
//        report_name.append("Mayo");
//        break;
//    case 6:
//        report_name.append("Junio");
//        break;
//    case 7:
//        report_name.append("Julio");
//        break;
//    case 8:
//        report_name.append("Agosto");
//        break;
//    case 9:
//        report_name.append("Septiembre");
//        break;
//    case 10:
//        report_name.append("Octubre");
//        break;
//    case 11:
//        report_name.append("Noviembre");
//        break;
//    case 12:
//        report_name.append("Diciembre");
//        break;
//    }
//    report_name.append("_").append(QString::number(QDate::currentDate().year())).append(".pdf");

//    QPrinter* print = new QPrinter(QPrinter::HighResolution);
//    print->setOutputFormat(QPrinter::PdfFormat);
//    print->setColorMode(QPrinter::Color);
//    QString final_path;
//    final_path.append(path).append("/").append(report_name);
//    print->setOutputFileName(final_path);

//    QTextDocument *document = new QTextDocument;

//    QTextCursor cursor(document);
//    cursor.movePosition(QTextCursor::Start);

//    QTextImageFormat picture1;
//    picture1.setName("://Images/membrete recibo-15.jpg");
//    picture1.setWidth(630);
//    picture1.setHeight(120);
//    cursor.insertImage(picture1,QTextFrameFormat::InFlow);

//    cursor.insertBlock();
//    cursor.insertBlock();
//    cursor.insertBlock();

//    QTextCharFormat header_format;
//    QFont headerfont;
//    headerfont.setFamily("Helvetica57");
//    headerfont.setBold(true);
//    header_format.setFont(headerfont);

//    cursor.insertText("Fecha: ",header_format);

//    QTextCharFormat text_format;
//    QFont textfont;
//    textfont.setFamily("Helvetica57-Condensed");
//    text_format.setFont(textfont);

//    QString str_date = QString::number(QDate::currentDate().day()).append("/");
//    str_date.append(QString::number(QDate::currentDate().month())).append("/");
//    str_date.append(QString::number(QDate::currentDate().year()));
//    cursor.insertText(str_date,text_format);

//    cursor.insertBlock();
//    cursor.insertBlock();

//    cursor.insertText("Atención: ",header_format);
//    cursor.insertText("Enjoy Life.",text_format);

//    cursor.insertBlock();
//    cursor.insertBlock();

//    cursor.insertText("Cliente: ",header_format);
//    cursor.insertText(raz_soc,text_format);

//    cursor.insertBlock();
//    cursor.insertBlock();
//    cursor.insertBlock();

//    QTextImageFormat picture2;
//    picture2.setName("://Images/linea-16.jpg");
//    picture2.setWidth(630);
//    picture2.setHeight(10);
//    cursor.insertImage(picture2,QTextFrameFormat::InFlow);

//    cursor.insertBlock();
//    cursor.insertBlock();
//    cursor.insertBlock();

//    QTextCharFormat text_italic_format;
//    QFont textitfont;
//    textitfont.setFamily("Helvetica57-Condensed");
//    textitfont.setItalic(true);
//    text_italic_format.setFont(textitfont);

//    cursor.insertText("De nuestra mayor consideración:",text_italic_format);

//    cursor.insertBlock();
//    cursor.insertBlock();

//    cursor.insertText("\t \t \t Se detalla el recibo de lo abonado para los servicios mensuales contratados.",text_italic_format);

//    cursor.insertBlock();
//    cursor.insertBlock();

//    cursor.insertText("Resumen: ",header_format);

//    cursor.insertBlock();
//    cursor.insertBlock();
//    cursor.insertBlock();

//    document->print(print);
//}
